﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 由事件的特性引发出了一种设计模式——观察者设计模式，该设计模式是为了定义对象之间的一种一对多的依赖关系，
// 以便于当一个对象的状态改变时，其他依赖他的对象会被自动告知并更新，该设计模式包含两个类
// 被观察者：它包含了其他对象感兴趣的内容，发布消息
// 观察者：用来监视被观察者对象，当被观察者触发事件时，观察者能够自动接收事件，订阅被观察者发出的消息

namespace 观察者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("黄色", "加菲猫");

            Mouse m1 = new Mouse("黑色", "米老鼠", cat);
            Mouse m2 = new Mouse("蓝色", "淘气", cat);
            Mouse m3 = new Mouse("白色", "舒克和贝塔", cat);
            Mouse m4 = new Mouse("彩色", "老鼠精", cat);

            //cat.CatComing(m1, m2, m3);
            
            // 事件不能在类的外部触发，只能在类的内部触发，比委托更安全
            cat.CatComing();
            //cat.action();
            Cat catt = new Cat("蓝色", "蓝猫");
            catt.CatComing();

            // 事件是特殊的委托，或者说是一种受限制的委托，是委托的一个特殊应用，二者本质上是一个东西
        }
    }
}
